#include"mystdio.h"
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<malloc.h>
#include<assert.h>



MY_FILE* my_fopen(const char* path, const char* mode)
{
  //识别标志位（打开方式）
  int flag=0;
  if(strcmp(mode,"r")==0) flag|=O_RDONLY;
  else if(strcmp(mode,"w")==0) flag |=(O_CREAT|O_WRONLY|O_TRUNC);
  else if(strcmp(mode,"a")==0) flag |=(O_CREAT|O_WRONLY|O_APPEND);

//调用系统接口open打开文件
  mode_t m=0666;
  int fd=0;
  if(flag&O_CREAT) fd=open(path,flag, m);
  else fd=open(path,flag);
  if(fd<0) return NULL;
//创建MYFILE对象 初始化
  MY_FILE* mf=(MY_FILE*)malloc(sizeof(MY_FILE));
  if(mf==NULL)
  {
    close(fd);
    return NULL;
  }

  mf->fd=fd;
  mf->flags=0;
  mf->flags |=BUFF_LINE;
  memset(mf->buffer,'\0',sizeof(mf->buffer));
  return mf;

 
  
}
size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* stream)
{
  //缓冲区满了直接刷新
  if(stream->current==NUM) my_fflush(stream);


  //拷贝到buffer
  size_t user_size=size*nmemb;
  size_t my_size=NUM-stream->current;
  size_t writen=0;
  if(my_size>=user_size)
  {
    memcpy(stream->buffer+stream->current,ptr,user_size);
    stream->current+=user_size;
    writen=user_size;
  }
  else{
    memcpy(stream->buffer+stream->current,ptr,my_size);
    stream->current=my_size;
    writen=my_size;
  }
  //根据刷新方式惊醒写入
  if(stream->flags&BUFF_ALL)
  {
    if(stream->current==NUM) my_fflush(stream);
  }
  else if(stream->flags&BUFF_LINE) 
  {
    if(stream->buffer[stream->current-1]=='\n') my_fflush(stream);

  }

  return writen;
  

}
int my_fclose(MY_FILE* fp)
{
  assert(fp);
  //1.冲刷缓冲区
  if(fp->current>0) my_fflush(fp);
  //关闭文件释放空间
  close(fp->fd);
  free(fp);
  fp=NULL;
  return 0;

}
int my_fflush(MY_FILE* fp)
{
  //系统接口write写入
  assert(fp);
  write(fp->fd,fp->buffer,fp->current);
  fp->current=0;
  fsync(fp->fd);
  return 0;

}
//#define LOG "log.txt"
//
//int main()
//{
//  umask(0);
//  //O_CREAT|O_WRONLY默认不会对原文件清空   O_TRUNC清空 O_APPEND追加
//  //O_RDONLY读
//  //int fd=open(LOG,O_CREAT|O_WRONLY|O_TRUNC,0666);
//  //int fd=open(LOG,O_CREAT|O_WRONLY|O_APPEND,0666);
//  int fd=open(LOG,O_RDONLY,0666);
//  if(fd==-1)
//  {
//    printf("fd:%d,errno:%d,errstring:%s\n",fd,errno,strerror(errno));
//  }
//  else{
//
////    const char* msg="hello ";
////    int cnt=5;
////    while(cnt)
////    {
////    char line[128];
////    snprintf(line,sizeof(line),"%s,%d\n",msg,cnt);
////    write(fd,line,strlen(line));
////    cnt--;
////    }
//
//    char buff[1024];
//    size_t n =read(fd,buff,sizeof(buff)-1);
//    if(n>0)
//    {
//      buff[n]='\0';
//      printf("%s",buff);
//
//    }
//  }
//
//
//
//
//
//
//
//
//
//  return 0;
//}
